package scau.mis4.chanyulin.atm.base.utils;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Created by cyl on 2017/4/2
 * 反射工具类
 */
public class ReflectUtils {

    /**
     * 通过属性名得到对应的Property获取的方法
     * @param clazz 属性所在类
     * @param fieldName 属性名
     */
    public static Method getPropertyMethod(Class clazz, String fieldName) {
        for (Method m : clazz.getDeclaredMethods()) {
            if (m.getName().equals(fieldName + "Property"))
                return m;
        }
        return null;
    }

    /**
     * 获取一个类的所有属性
     * @param clazz 属性所在类
     */
    public static Field[] getFields(Class clazz) {
        return clazz.getDeclaredFields();
    }

    /**
     * 获取一个类的某个属性
     * @param clazz 属性所在类
     */
    public static Field getField(Class clazz, String fieldName) {
        Field field = null;
        for (Field f : getFields(clazz)) {
            if (f.getName().equals(fieldName)) {
                field = f;
                break;
            }
        }
        return field;
    }

    /**
     * 获取一个类的属性对应的值
     * @param clazz 属性所在类
     * @param propertyName 属性名
     * @param obj 相应的对象
     */
    public static Object getPropertyValue(Class clazz, String propertyName, Object obj) {
        Object value = null;
        try {
            PropertyDescriptor pd = new PropertyDescriptor(getField(clazz, propertyName).getName(), clazz);
            Method getMethod = pd.getReadMethod();
            value = getMethod.invoke(obj);
        } catch (IllegalAccessException | InvocationTargetException | IntrospectionException e) {
            e.printStackTrace();
        }
        return value;
    }

}
